Documentation (C++ library)
Overview
WOLF is a library for state estimation for robotics, based on factor graphs.
WOLF organizes the typical entities appearing in robotic navigation. These entities are:
The robot hardware and software
Sensors
Processors
The robot trajectory over time
Frames (a.k.a. keyframes)
Captures of raw data taken at the time of the keyframes
Features extracted from the captures data
Factors linking these features to other entities. Factors are diverse, e.g.:
Motion and loop closure factors relate to other keyframes
Landmark factors relate to landmarks in the map
Calibration factors relate to sensor parameters
Absolute factors relate to some constant value
Many factors have combined relations among the above. This makes them more interesting and powerful.
The map of the surroundings
Landmarks
This tree-like structure is what constitutes the WOLF tree, the central data structure of WOLF.
In a nutshell, incoming raw data is processed by the front-ends (the processors) to generate a wolf tree, which is then solved by a back-end (the solver).
WOLF is designed with a modular approach so that new sensors and algorithms can be incorporated in a scalable way.
We use for this the WOLF plugins, which act as dynamic libraries that can be loaded at runtime,
We also use WOLF autoconf, which provides a straightforward configuration process via YAML configuration files.
The core of WOLF is organized with three basic entities:
The WOLF tree, a structure holding all the information of the estimation problem
The WOLF processors (which are part of the tree), a collection of front-ends, usually one per sensor, which process raw data and populate the wolf tree
A solver wrapper for factor graphs, the back-end that extracts the underlying factor graph from the WOLF tree, and solves it. WOLF actualy provides a wrapper to an external solver. Currently, we use Google Ceres as the external solver.
WOLF provides tools for input/output and configuration:
Configuration is achieved via text files in YAML format, which are parsed and used at runtime to set up the problem.
Input is achieved through ROS subscribers, should you use ROS as your robotics environment. Out of ROS, it is the user responsibility to read raw data from the drivers and provide it to the appropriate WOLF objects.
Output is achieved through publishers that will be used for visualization and/or robot control.
WOLF tools for interfacing with ROS are provided in separate packages. WOLF can also be used out or ROS. A basic representation of the information flow in WOLF using ROS is sketched below:
Basic processing flow in WOLF using ROS
Contents
TODO: update
-
introduces the main data structure and all its constituents. This structure is made basically of base classes, defining generic robotics problems.
-
explains how the states are handled in WOLF, distributed along the WOLF tree and indexed by keys.
-
explains how the interface with a non-linear solver is implemented in WOLF.
-
allows users to configure many diverse robotics projects without the need of writing any C++ code.
-
allow users to derive the base classes of the WOLF tree to satisfy their particular sensory needs. Several plugins are available with the basic WOLF distribution.